package seqlist;

import javax.swing.plaf.metal.MetalIconFactory;
import java.util.Arrays;

/**
 * @author shkstart
 * @create 2022-08-08-22:28
 */
public class DynamicArray {

    //    定义属性
//    elementData就是具体存储元素的数组
    private int[] elementData;
    //    当前动态数组存储了几个元素
    private int size;

    public DynamicArray() {
        this.elementData = new int [10];
    }

    public DynamicArray(int size) {
        this.elementData = new int [size];
    }

    /**
     * 在头部添加元素
     *
     * @param data
     */
    public void addFirst(int data) {
        addIndex(0,data);
    }

    /**
     * 在尾部添加元素
     *
     * @param data
     */
    public void addLast(int data) {
        addIndex(size,data);
    }

    /**
     * 在数组的索引index添加元素
     *
     * @param data
     */
    public void addIndex(int index, int data) {

        //判断边界值
        if(index<0||index>size){
            System.out.println("承认的index非法");
            return;
        }
        if(size==elementData.length){
            grow();
        }
        for (int i = size -1; i >=index ; i--) {
            elementData[i + 1] = elementData[ i ];
        }
        elementData[index] = data;
        size++;
    }

    //内部扩容方法
    private void grow() {
        //将原数组搬移到新数组
        elementData = Arrays.copyOf(elementData,elementData.length*2);
    }


    //获取当前数组的长度
    public int getSize() {
        return size;
    }

    //将当前动态数组转换为字符串
    public String toString() {
        String ret = "[";
        for (int i = 0; i < size; i++) {
            if(i!=size-1){
            ret += elementData[i]+",";
            }else {
                ret += elementData[i];
            }
        }
        ret += "]";
        return  ret;
    }

    /**
     * 将指定位置index的元素改为新值
     *
     * @param index
     * @param newData
     * @return 新值
     */
    public int set(int index, int newData) {
        if(rangeCheck(index)){
            elementData[index]=newData;
        }
        return elementData[index];
    }

    /**
     * 校验当前传入的index是否合法（用在查询，设置，删除）
     *
     * @param index
     * @return
     */
    private boolean rangeCheck(int index) {
        if(index<0||index>=size){
            return false;
        }
        return true;
    }

    public int get(int index) {
        if(rangeCheck(index)){
            return elementData[index];
        }
        return  -1;
    }

    /**
     * 判断当前集合是否包含指定元素data
     *
     * @param args
     */
    public boolean contains(int data) {
        for (int i = 0; i < size; i++) {
            if(elementData[i]==data){
                return true;
            }
        }
        return true;
    }

    /**
     * 删除指定下标
     *
     * @param args
     */
    public void remove(int index) {
        if(rangeCheck(index)){
            for (int i = index; i <size -1 ; i++) {
                elementData[i] =elementData[i+1];
            }
            elementData[size-1]=0;
            size--;
        }
    }

    /**
     * 按值删除
     *
     * @param value
     */
    public void removeValue(int value) {
        if(contains(value)){
            for (int i = 0; i < size - 1; i++) {
                while (elementData[i]==value&&i<size){
                    remove(i);
                }
            }
        }
    }


    public static void main(String[] args) {
        DynamicArray dynamicArray = new DynamicArray(10);
        dynamicArray.addLast(1);
        dynamicArray.addLast(3);
        dynamicArray.addFirst(5);
        dynamicArray.addLast(7);
        dynamicArray.addIndex(1, 10);
        //[5,10,1,3,7]
        System.out.println(dynamicArray.toString());
//        dynamicArray.removeValue(2);
        dynamicArray.remove(1);
        System.out.println(dynamicArray.toString());


    }
}
